#ifndef __THREADPOOL_H__：
#define __THREADPOOL_H__
#include <memory>
#include <vector>
#include <functional>
#include <mutex>
#include <queue>
#include <atomic>
#include <thread>
#include <condition_variable>
#include <chrono>
#include <iostream>
#include "Nocopyable.hpp"
#include "Task.h"
enum class PoolMode
{
    MODE_FIXED,  // 线程池模式 fixed 固定线程数量模式
    MODE_CACHED, // cached 动态增长线程模式
};
/*
 *线程池实现
 * */
class ThreadPool:public Nocopyable
{
public:
    ThreadPool();
    ~ThreadPool();
    void start(size_t initThreadSize);
    void setMode(PoolMode mode);//设置线程池模式
    void setTaskQueMaxThreshHold(int threshhold); //设置线程池任务最大数量
    void setThreadSizeThreshHold(int threshhold); //设置线程池线程最大数量
    void submitTask(std::shared_ptr<Task>& task); //提交任务
private:
    class Thread{
        using ThreadFunc=std::function<void()>;
    public:
        Thread(ThreadFunc && func);
        void start();
    private:
        ThreadFunc func_; //线程入口函数
    };
private:
    void threadFunc();
private:
    size_t initThreadSize_; //初始化线程池 线程数量
    std::atomic_int threadSize_;//线程池线程数量
    size_t threadSizeThreshHold_; //线程池线程数量上限
    size_t taskSizeThreshHold_ ; //线程池任务数量上限
    PoolMode mode_; //线程池模式
    std::vector<std::unique_ptr<Thread>> threads_; //线程池线程容器
    std::queue<std::shared_ptr<Task>> taskQue_;
    std::atomic_uint taskSize_; //线程池任务数量
    std::recursive_mutex mutex_; //线程池任务队列互斥锁
    std::condition_variable_any notFull_;
    std::condition_variable_any notEmpty_;
};

#endif
